﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Web.Mvc;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.Metadata.Edm;
using System.Data.SqlTypes;
using System.Data.Sql;
using PagedList;


namespace SoftHotel.Models
{
    public class ProveedorDAO : DbContext
    {
        public DbSet<Proveedor> proveedor { get; set; }
        //public DbSet<ProductoXProveedor> productoProveedor { get; set; }

        public ProveedorDAO(): base("conexionPrincipalDAO")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Proveedor>().ToTable("Proveedor");
            //modelBuilder.Entity<ProductoXProveedor>().ToTable("ProductoXProveedor");
            modelBuilder.Entity<Parametro>().ToTable("Parametro");
            modelBuilder.Entity<Producto>().ToTable("Producto");
        }

        /*private Conexion conexionBD = new Conexion();
        public List<Proveedor> pbuscadis = new List<Proveedor>() { };
        public List<Proveedor> listaProveedores = new List<Proveedor>() { };
        static private List<ProductoModel> listaProductosAux; //este se volverá a crear cada vez que se haga una busqueda
        static private List<ProductoModel> listaProductos = new List<ProductoModel>();

        //----Para agregar
        public bool verificarProveedorAgregado(Proveedor proveedor)
        {
            foreach (Proveedor prov in listaProveedores)
            {
                if ((prov.ruc == proveedor.ruc) && (prov.razon == proveedor.razon))
                    return true;
            }
            return false;
        }
        public void agregarProveedor(Proveedor proveedor)
        {
            listaProveedores.Add(proveedor);
        }
        //----

        //----Para registrar a los proveedores
        public void registrarProveedores()
        {
            //registrar listaProveedores en la base de datos
            //abrir conexion BD
            //realizar un insert por cada uno
            //cambiar los tipos de datos de los atributos de string
            string consulta;
            foreach (Proveedor prov in listaProveedores)
            {
                //atributos dateados
                //armar comando
                int estado = buscarEstado(prov.estado);
                DateTime now1 = DateTime.Now;
                string now = String.Format("{0:d/M/yyyy HH:mm:ss}", now1);

                consulta= "insert into Proveedor (razonSocial, ruc, direccion, email, telefono, movil, estado, representante, dniRepresentante, fechaRegistro)"+
                    " values (@razon, @ruc, @dir, @email, @fono, @movil, @estado, @representante, @dniRepresentante, @now1)";
                //es necesario abrir la conexion antes de hacer el comando
                conexionBD.AbrirConexion();
                SqlCommand command = conexionBD.connection.CreateCommand();
                command.CommandText = consulta;
                command.Parameters.Add("@razon", SqlDbType.VarChar,50).Value= prov.razon;
                command.Parameters.Add("@ruc", SqlDbType.VarChar, 11).Value=prov.ruc;
                command.Parameters.Add("@dir", SqlDbType.VarChar, 50).Value=prov.dir;
                command.Parameters.Add("@email", SqlDbType.VarChar, 50).Value=prov.mail;
                command.Parameters.Add("@fono", SqlDbType.VarChar, 30).Value=prov.fono;
                command.Parameters.Add("@movil", SqlDbType.VarChar, 30).Value=prov.celular;
                command.Parameters.Add("@estado", SqlDbType.Int).Value=estado;
                command.Parameters.Add("@representante", SqlDbType.VarChar, 50).Value=prov.representante;
                command.Parameters.Add("@dniRepresentante", SqlDbType.VarChar, 11).Value=prov.dni;
                command.Parameters.Add("@now1", SqlDbType.DateTime).Value=now;
                conexionBD.EjecutarComando2(command);

            }
        }
        //----

        //----Buscar el id correspondiente del estado
        public int buscarEstado(string estado)
        {
            int x=0;
            string query = "select * from Parametro where tipo = 'ESTADO_PROVEEDOR' and valor = '" + estado + "'";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
            {
                x = Int32.Parse(dr[0].ToString());
            }

            return x;
        }    
        //----

        //----Buscar la descripcion del estado correspondiente
        public string buscarEstado(int estado)
        {
            string descrip = "";
            string query = "select * from Parametro where tipo = 'ESTADO_PROVEEDOR' and idParametro = '" + estado + "'";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
            {
                descrip = dr[2].ToString();
            }

            return descrip;
        }    

        //----Vacea la lista de proveedores, ya que ya se agregaron
        public void vaciarProveedores()
        {
            listaProveedores = new List<Proveedor>() { };
        }



        //----Obtener los listados como los "estados", etc.
        public SelectListItem[] obtenerCombo(string tipo)
        {
            //conexionBD.AbrirConexion();
            List<SelectListItem> ls = new List<SelectListItem>();
            string query = "select valor from Parametro where tipo = '" +tipo+ "'";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            while (dr != null && dr.Read())
            {
                ls.Add(new SelectListItem { Value = dr[0].ToString(), Text = dr[0].ToString() });
            }
            SelectListItem[] sls = new SelectListItem[ls.Count];
            for (int i = 0; i < ls.Count; i++)
            {
                sls[i] = ls[i];
            }
            return sls;
        }
        //----

        //----Buscar proveedores
        public List<Proveedor> buscarProveedores(Proveedor proveedor){

            string consulta = "SELECT razonSocial, ruc, estado, telefono, representante FROM PROVEEDOR WHERE 1=1 ";
            List<Proveedor> resultadoBusqueda = new List<Proveedor>();

            //
            ProveedorDAO consultor = new ProveedorDAO();
            //
            if (proveedor.razon != null)
                consulta += "and razonSocial LIKE '%" + proveedor.razon + "%' " ;
            if (proveedor.ruc != null)
                consulta += "and ruc LIKE '%" + proveedor.ruc + "%' ";
            if (proveedor.estado != null){
                int estado = buscarEstado(proveedor.estado);
                consulta += "and estado = " + estado;
            }
            if (proveedor.fono != null)
                consulta += "and telefono LIKE '%" + proveedor.fono + "%' ";
            if (proveedor.representante != null)
                consulta += "and representante LIKE '%" + proveedor.representante + "%' ";

            SqlDataReader dr = conexionBD.EjecutarReader(consulta);
            while (dr != null && dr.Read())
            {
                Proveedor auxProv = new Proveedor();
                auxProv.razon = dr["razonSocial"].ToString();
                auxProv.ruc = dr["ruc"].ToString();
                //
                string datos = consultor.obtenerDatos(Int32.Parse(dr["estado"].ToString()));
                //
                //auxProv.estado = dr["estado"].ToString();
                auxProv.estado = datos;
                auxProv.fono = dr["telefono"].ToString();
                auxProv.representante = dr["representante"].ToString();

                resultadoBusqueda.Add(auxProv);
            }

            conexionBD.CerrarConexion();
            return resultadoBusqueda;
            //ejectuar reader
            //cerrar conexion
        }
        //----
        public string obtenerDatos(int x)
        {
            string datos = "";
            //conexionBD.AbrirConexion();//mare xurrevicky
            string query = "SELECT valor FROM Parametro WHERE idParametro =" + x;
            SqlDataReader dr3 = conexionBD.EjecutarReader(query);
            if (dr3 != null && dr3.Read())
            {
                datos = dr3["valor"].ToString();
            }
            dr3.Close();

            return datos;
        }

        //----Consultar un único proveedor para el detalle
        public Proveedor consultarDetalle(string razonSocial)
        {
            string consulta = "SELECT * FROM PROVEEDOR WHERE razonSocial = '" + razonSocial + "'";
            SqlDataReader dr = conexionBD.EjecutarReader(consulta);
            Proveedor prov = new Proveedor();
            if (dr != null && dr.Read())
            {
                prov.razon = dr[1].ToString();
                prov.ruc = dr[2].ToString();
                prov.dir = dr[3].ToString(); 
                prov.mail = dr[4].ToString(); 
                prov.fono = dr[5].ToString();
                prov.celular = dr[6].ToString();
                //para estado
                string estado = buscarEstado(Int32.Parse(dr[7].ToString()));
                prov.estado = estado;
                prov.representante = dr[8].ToString();
                prov.dni = dr[9].ToString();
                prov.fechaRegistro = dr[10].ToString();   
            }
            return prov;
        }
        //----


        //----
        public int obtenerIDprov(Proveedor objetoDetalle)
        {
            int id=0;
            string consulta = "SELECT * FROM Proveedor WHERE ruc = '" + objetoDetalle.ruc + "'";
            SqlDataReader dr = conexionBD.EjecutarReader(consulta);
            if (dr != null && dr.Read())
                id = Int32.Parse(dr[0].ToString());
            return id;
        }


        //----Editar proveedor
        public void editar(int id, Proveedor prov)
        {
            int estado = buscarEstado(prov.estado);
            string consulta = "UPDATE PROVEEDOR SET razonSocial = @razon, ruc = @ruc, direccion = @dir, email = @email, telefono = @fono, " +
                 "movil = @movil, estado = @estado, representante = @representante, dniRepresentante = @dniRepresentante " +
                "WHERE idProveedor = @id";
            //es necesario abrir la conexion antes de hacer el comando
            conexionBD.AbrirConexion();
            SqlCommand command = conexionBD.connection.CreateCommand();
            command.CommandText = consulta;
            command.Parameters.Add("@razon", SqlDbType.VarChar, 50).Value = prov.razon;
            command.Parameters.Add("@ruc", SqlDbType.VarChar, 11).Value = prov.ruc;
            command.Parameters.Add("@dir", SqlDbType.VarChar, 50).Value = prov.dir;
            command.Parameters.Add("@email", SqlDbType.VarChar, 50).Value = prov.mail;
            command.Parameters.Add("@fono", SqlDbType.VarChar, 30).Value = prov.fono;
            command.Parameters.Add("@movil", SqlDbType.VarChar, 30).Value = prov.celular;
            command.Parameters.Add("@estado", SqlDbType.Int).Value = estado;
            command.Parameters.Add("@representante", SqlDbType.VarChar, 50).Value = prov.representante;
            command.Parameters.Add("@dniRepresentante", SqlDbType.VarChar, 11).Value = prov.dni;
            command.Parameters.Add("@id", SqlDbType.Int).Value = id;
            try
            {
                conexionBD.EjecutarComando2(command);
            }
            catch (Exception e)
            {
            }
        }
        //----

        
        //----logica del vincular
        public bool verificarProdAgregado(List<ProductoModel> listaProdAux, ProductoModel prod)
        {
            foreach (ProductoModel prodAux in listaProdAux)
                {
                    if ((prodAux.idProducto == prod.idProducto))
                        return true;
                }
                return false;
        }

        public void agregarProd(List<ProductoModel> listaProdAux, ProductoModel prod){
            listaProdAux.Add(prod);
        }

        public void agregarProdListAux(List<ProductoModel> listaProdAux, ProductoModel prod)
        {
            //esta agregado?
            if (verificarProdAgregado(listaProdAux,prod))
            {
                //string mensaje = "El proveedor ya ha sido agregado";
                //mensaje = mensaje;
            }
            else
            {
                agregarProd(listaProdAux,prod);
            }
        }

        public void mergeListas(List<ProductoModel> listaProdAux, List<ProductoModel> listaProdFinal)
        {
            foreach (ProductoModel prodAux in listaProdAux)
            {
                int i = 0;
                try
                {
                    foreach (ProductoModel prodFinal in listaProdFinal)
                    {
                        if (prodFinal.idProducto != prodAux.idProducto)
                            listaProdFinal.Add(prodAux);
                        i++;
                    }
                    if (i == 0)
                        listaProdFinal.Add(prodAux);
                }
                catch (Exception e)
                {
                }
                
            }
            
            
        }


        public void vincularProductos(List<ProductoModel> listaProdFinal, string ruc)
        {
            string consulta1, consulta2;
            int idProd, idProv=0;
            foreach (ProductoModel prod in listaProdFinal)
            {
                //
                consulta1 = "select idProveedor from Proveedor where ruc = " + ruc;
                SqlDataReader dr = conexionBD.EjecutarReader(consulta1);
                if (dr != null && dr.Read())
                    idProv = Int32.Parse(dr["idProveedor"].ToString());

                //
                consulta2 = "insert into ProductoXProveedor (idProducto, idProveedor) " +
                    " values (@idProducto, @idProveedor)";
                //es necesario abrir la conexion antes de hacer el comando
                conexionBD.AbrirConexion();
                SqlCommand command = conexionBD.connection.CreateCommand();
                command.CommandText = consulta2;
                idProd = Int32.Parse(prod.idProducto);
                command.Parameters.Add("@idProducto", SqlDbType.Int).Value = idProv;
                command.Parameters.Add("@idProveedor", SqlDbType.Int).Value = idProd;
                
                conexionBD.EjecutarComando2(command);

            }
        }

        public void vaciarListaProductos(List<ProductoModel> listaProdFinal)
        {
            listaProdFinal = new List<ProductoModel>();
        }
        //----

        /*
        public List<ProductoModel> productosVinculados(Proveedor objetoDetalle)
        {
            
            string consulta = "SELECT razonSocial, ruc, estado, telefono, representante FROM ProductoXProveedor WHERE 1=1 ";
            List<ProductoModel> resultadoBusqueda = new List<ProductoModel>();

            if (proveedor.razon != null)
                consulta += "and razonSocial LIKE '%" + proveedor.razon + "%' ";
            if (proveedor.ruc != null)
                consulta += "and ruc LIKE '%" + proveedor.ruc + "%' ";
            if (proveedor.estado != null)
            {
                int estado = buscarEstado(proveedor.estado);
                consulta += "and estado = " + estado;
            }
            if (proveedor.fono != null)
                consulta += "and telefono LIKE '%" + proveedor.fono + "%' ";
            if (proveedor.representante != null)
                consulta += "and representante LIKE '%" + proveedor.representante + "%' ";

            SqlDataReader dr = conexionBD.EjecutarReader(consulta);
            while (dr != null && dr.Read())
            {
                Proveedor auxProv = new Proveedor();
                auxProv.razon = dr["razonSocial"].ToString();
                auxProv.ruc = dr["ruc"].ToString();
                auxProv.estado = dr["estado"].ToString();
                auxProv.fono = dr["telefono"].ToString();
                auxProv.representante = dr["representante"].ToString();

                resultadoBusqueda.Add(auxProv);
            }

            conexionBD.CerrarConexion();
            return resultadoBusqueda;
             
        }*/
    }
}

